<?php
/*
 * @Author: an
 * @Date: 2021/12/10
 * @Description: 融云用户相关
 */


namespace App\Services\RongCloud;


class UserService extends BaseService
{
    /**
     * 注册用户
     * @param $userId 用户ID
     * @param $name 用户名称
     * @param $portraitUri 用户头像
     * @return array
     * @author an
     * @time 2021-12-10 14:27
     */
    public function register($userId, $name, $portraitUri = '')
    {
        $headers = $this->getHeaders();
        $body = http_build_query([
            'userId' => $userId,
            'name' => $name,
            'portraitUri' => $portraitUri
        ]);
        $url = $this->mainHost . '/user/getToken.json';
        $data = $this->request($url, $body, $headers);
        return resultRongCloudInfo($data);
    }

    /**
     * Token 失效
     * @param $userId 需要设置 Token 失效的用户 ID，支持设置多个最多不超过 20 个
     * @param $time 过期时间戳精确到毫秒，不能大于或等于当前系统时间，该时间戳前用户获取的 Token 全部失效，
     * 使用时间戳之前的 Token 已经在连接中的用户不会立即失效，断开后无法进行连接
     * @return bool|mixed|string
     * @author an
     * @time 2021-12-10 15:18
     */
    public function tokenExpire($userId, $time)
    {
        $headers = $this->getHeaders();
        $body = http_build_query([
            'time' => $time
        ]);
        if (!is_array($userId)) {
            $body .= '&userId=' . $userId;
        } else {
            if (count($userId) > 20) {
                return ['code' => 400, 'message' => '操作用户一次不能添加超过20个', 'data' => null];
            }
            $body .= '&' . my_build_query('userId', $userId);
        }
        $url = $this->mainHost . '/user/token/expire.json';
        $data = $this->request($url, $body, $headers);
        return resultRongCloudInfo($data);
    }

    /**
     * 获取用户信息
     * @param $userId 用户ID
     * @return array
     * @author an
     * @time 2021-12-10 15:04
     */
    public function userInfo($userId)
    {
        $headers = $this->getHeaders();
        $body = http_build_query([
            'userId' => $userId,
        ]);
        $url = $this->mainHost . '/user/info.json';
        $data = $this->request($url, $body, $headers);
//        {"code":200,"userName":"an","userPortrait":"","createTime":"2021-12-10 14:36:26"}
        return resultRongCloudInfo($data);
    }

    /**
     * 修改用户信息
     * @param $userId 用户ID
     * @param $name 用户名称
     * @param $portraitUri 用户头像
     * @return bool|mixed|string
     * @author an
     * @time 2021-12-10 15:28
     */
    public function refresh($userId, $name, $portraitUri = '')
    {
        $headers = $this->getHeaders();
        $body = http_build_query([
            'userId' => $userId,
            'name' => $name,
            'portraitUri' => $portraitUri
        ]);
        $url = $this->mainHost . '/user/refresh.json';
        $data = $this->request($url, $body, $headers);
        return resultRongCloudInfo($data);
    }

    /**
     * 封禁用户
     * @param $userId 用户ID 用户 Id，支持一次封禁多个用户，最多不超过 20 个。
     * @param $minute 以分钟为最小单位，最长封禁 30 天（43200 分钟）
     * 封禁期内用户无法连接融云，无法使用 IM 服务
     * @return bool|mixed|string
     * @author an
     * @time 2021-12-10 15:34
     */
    public function block($userId, $minute)
    {
        $headers = $this->getHeaders();
        $body = http_build_query([
            'minute' => $minute,
        ]);
        if (!is_array($userId)) {
            $body .= '&userId=' . $userId;
        } else {
            if (count($userId) > 20) {
                return ['code' => 400, 'message' => '操作用户一次不能添加超过20个', 'data' => null];
            }
            $body .= '&' . my_build_query('userId', $userId);
        }
        $url = $this->mainHost . '/user/block.json';
        $data = $this->request($url, $body, $headers);
        return resultRongCloudInfo($data);
    }

    /**
     * 解除封禁用户
     * @param $userId 用户ID
     * @return bool|mixed|string
     * @author an
     * @time 2021-12-10 15:39
     */
    public function unblock($userId)
    {
        $headers = $this->getHeaders();
        $body = http_build_query([
            'userId' => $userId,
        ]);
        $url = $this->mainHost . '/user/unblock.json';
        $data = $this->request($url, $body, $headers);
        return resultRongCloudInfo($data);
    }

    /**
     * 封禁用户列表
     * @param int $page 分页获取封禁用户列表时当前页数, 不传或传入 0 时不做分页处理,
     * 默认获取前 1000 个被封禁的用户列表, 按封禁结束时间倒序排序。
     * @param int $size 分页获取封禁用户列表时每页行数, 不传时默认为 50 条。
     * @return array userId用户ID, blockEndTime封禁结束时间
     * @author an
     * @time 2021-12-10 15:42
     */
    public function blockList($page = 1, $size = 50)
    {
        $headers = $this->getHeaders();
        $body = http_build_query([
            'page' => $page,
            'size' => $size,
        ]);
        $url = $this->mainHost . '/user/block/query.json';
        $data = $this->request($url, $body, $headers);
        return resultRongCloudInfo($data);
    }

    /**
     * 删除用户
     * 开发环境注册用户上限为 100 个，已有注册用户可通过 开发者后台 进行删除。
     * 生产环境下开通商用版后不限制注册用户数，免费版用户上限为 100 个，不提供删除功能。
     */


    /**
     * 查询在线状态
     * 调用频率： 每秒钟限 100 次
     * @param $userId 用户ID
     * @return array status在线状态，1为在线，0为不在线。
     * @author an
     * @time 2021-12-10 15:57
     */
    public function userStatus($userId)
    {
        $headers = $this->getHeaders();
        $body = http_build_query([
            'userId' => $userId,
        ]);
        $url = $this->mainHost . '/user/checkOnline.json';
        $data = $this->request($url, $body, $headers);
        return resultRongCloudInfo($data);
    }

    /**
     * 添加黑名单
     * 每秒钟限 100 次
     * @param $userId 用户ID
     * @param $blackUserId 被加入黑名单的用户 Id，每次最多添加 20 个用户
     * @return bool|mixed|string
     * @author an
     * @time 2021-12-10 16:03
     */
    public function addBlack($userId, $blackUserId)
    {
        $headers = $this->getHeaders();
        $body = http_build_query([
            'userId' => $userId
        ]);
        if (!is_array($userId)) {
            $body .= '&blackUserId=' . $blackUserId;
        } else {
            if (count($blackUserId) > 20) {
                return ['code' => 400, 'message' => '操作用户一次不能添加超过20个', 'data' => null];
            }
            $body .= '&' . my_build_query('blackUserId', $blackUserId);
        }
        $url = $this->mainHost . '/user/blacklist/add.json';
        $data = $this->request($url, $body, $headers);
        return resultRongCloudInfo($data);
    }

    /**
     * @param $userId
     * @param $blackUserId 被拉黑用户ID, 每次最多移除 20 个用户
     * @return bool|mixed|string
     * @author an
     * @time 2021-12-10 16:05
     */
    public function removeBlack($userId, $blackUserId)
    {
        $headers = $this->getHeaders();
        $body = http_build_query([
            'userId' => $userId
        ]);
        if (!is_array($userId)) {
            $body .= '&blackUserId=' . $blackUserId;
        } else {
            if (count($blackUserId) > 20) {
                return ['code' => 400, 'message' => '操作用户一次不能添加超过20个', 'data' => null];
            }
            $body .= '&' . my_build_query('blackUserId', $blackUserId);
        }
        $url = $this->mainHost . '/user/blacklist/remove.json';
        $data = $this->request($url, $body, $headers);
        return resultRongCloudInfo($data);
    }

    /**
     * 某个用户的黑名单列表
     * @param $userId 用户ID
     * @return bool|mixed|string
     * @author an
     * @time 2021-12-10 16:05
     */
    public function queryBlack($userId)
    {
        $headers = $this->getHeaders();
        $body = http_build_query([
            'userId' => $userId,
        ]);
        $url = $this->mainHost . '/user/blacklist/query.json';
        $data = $this->request($url, $body, $headers);
        return resultRongCloudInfo($data);
    }

    /**
     * 用户白名单
     * 限制用户之间发送消息，例如：用户 A 将 B 加入白名单后，用户 B 才能给 A 发送消息，
     * 针对强好友关系的应用场景可使用此功能
     * 1、用户白名单服务与用户黑名单服务不能同时使用，融云默认开启的是用户黑名单服务，如客户应用默认需要白名单模式，可提交工单申请开通用户白名单功能。
     * 2、建立用户白名单关系同时，需要在开发者应用服务器维护一份用户白名单关系，以方便对业务数据的处理。
     * 3、如果客户之前使用了黑名单功能，开通白名单功能后，黑名单功能不再生效，但原黑名单中设置的信息不会丢失，开发者切换回黑名单功能时，原黑名单设置仍然生效。
     */

    /**
     * 设置用户禁言
     * @param $userId 用户ID 被禁言用户 Id，支持批量设置，最多不超过 1000 个。
     * @param $state 禁言状态，0 解除禁言、1 添加禁言
     * @param string $type 会话类型，目前支持单聊会话 PERSON
     * @return bool|mixed|string
     * @author an
     * @time 2021-12-10 16:14
     */
    public function setFb($userId, $state, $type = 'PERSON')
    {
        $headers = $this->getHeaders();
        $body = http_build_query([
            'state' => $state,
            'type' => $type,
        ]);
        if (!is_array($userId)) {
            $body .= '&userId=' . $userId;
        } else {
            $body .= '&' . my_build_query('userId', $userId);
        }
        $url = $this->mainHost . '/user/chat/fb/set.json';
        $data = $this->request($url, $body, $headers);
        return resultRongCloudInfo($data);
    }

    /**
     * 查询禁言用户列表
     * @param $num 获取行数，默认为 100，最大支持 200 个。
     * @param $offset 查询开始位置，默认为 0。
     * @param string $type 会话类型，目前支持单聊会话 PERSON。
     * @return bool|mixed|string
     * @author an
     * @time 2021-12-10 16:16
     */
    public function queryFb($num, $offset, $type = 'PERSON')
    {
        $headers = $this->getHeaders();
        $body = http_build_query([
            'num' => $num,
            'offset' => $offset,
            'type' => $type,
        ]);
        $url = $this->mainHost . '/user/chat/fb/querylist.json';
        $data = $this->request($url, $body, $headers);
        return resultRongCloudInfo($data);
    }
}
